/*
 *  Copyright (C) 2010 glauco
 * 
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.balisunrise.common;

/**
 *
 * @author glauco
 */
public class SyncResult {

    private Object source;
    private String sourceProperty;
    private Object target;
    private String targetProperty;
    private Object oldPropertyValue;
    private Object newPropertyValue;
    private SyncType syncType;
    private ResultType resultType;
    private Cause cause;
    private String exceptionMessage;

    /**
     * Tipo de Sincronização.
     */
    public enum SyncType {

        /**
         * O valor da propriedade do source é atribuido a propriedade do target.
         */
        SOURCE_TO_TARGET,
        /**
         * O valor da propriedade do target é atribuido a propriedade do source.
         */
        TARGET_TO_SOURCE
    }

    /**
     * Resultado da Sincronização.
     */
    public enum ResultType {

        /**
         * Quando a sincronização é realizada.
         */
        SUCCESS,
        /**
         * Quando ocorre algum problema, seja por não ter acesso a propriedade
         * do objeto ou o objeto seja nulo.
         */
        FAILURE,
        /**
         * Quando ocorre alguma Exception com o Conversor ou com o Validator ou
         * durante o método set da propriedade.
         */
        EXCEPTION
    }

    /**
     * Motivo do resultado quando falhar a sincronização.
     */
    public enum Cause {

        /**
         * Quando não é possível ler o valor da propriedade do source.
         */
        SOURCE_UNREADABLE,
        /**
         * Quando não é possível atribuir o valor à propriedade do source.
         */
        SOURCE_UNWRITEABLE,
        /**
         * Quando não é possível ler o valor da propriedade do target.
         */
        TARGET_UNREADABLE,
        /**
         * Quando não é possível atribuir o valor à propriedade do target.
         */
        TARGET_UNWRITABLE,
        /**
         * Quando ocorre uma exception durante a conversão.
         */
        CONVERTION_EXCEPTION,
        /**
         * Quando ocorre uma exception durante a validação.
         */
        VALIDATION_EXCEPTION,
        /**
         * Quando ocorre uma exception durante a atribuição da propriedade do
         * source.
         */
        SOURCE_EXCEPTION,
        /**
         * Quando ocorre uma exception durante a atribuição da propriedade do
         * target.
         */
        TARGET_EXCEPTION
    }

    /**
     * Busca a mensagem de exceção.
     * Só exite a mensagem se tipo de resultado for EXCEPTION, caso contrário
     * será {@code null}
     * @return a mensagem de exceção.
     */
    public String getExceptionMessage() {
        return exceptionMessage;
    }

    /**
     * Atribui a mensagem de exceção.
     * @param exceptionMessage a mensagem de exceção.
     */
    public void setExceptionMessage(String exceptionMessage) {
        this.exceptionMessage = exceptionMessage;
    }

    public Object getNewPropertyValue() {
        return newPropertyValue;
    }

    public void setNewPropertyValue(Object newPropertyValue) {
        this.newPropertyValue = newPropertyValue;
    }

    public Object getOldPropertyValue() {
        return oldPropertyValue;
    }

    public void setOldPropertyValue(Object oldPropertyValue) {
        this.oldPropertyValue = oldPropertyValue;
    }

    public ResultType getResultType() {
        return resultType;
    }

    public void setResultType(ResultType resultType) {
        this.resultType = resultType;
    }

    public Object getSource() {
        return source;
    }

    public void setSource(Object source) {
        this.source = source;
    }

    public String getSourceProperty() {
        return sourceProperty;
    }

    public void setSourceProperty(String sourceProperty) {
        this.sourceProperty = sourceProperty;
    }

    public SyncType getSyncType() {
        return syncType;
    }

    public void setSyncType(SyncType syncType) {
        this.syncType = syncType;
    }

    public Object getTarget() {
        return target;
    }

    public void setTarget(Object target) {
        this.target = target;
    }

    public String getTargetProperty() {
        return targetProperty;
    }

    public void setTargetProperty(String targetProperty) {
        this.targetProperty = targetProperty;
    }

    public Cause getCause() {
        return cause;
    }

    public void setCause(Cause cause) {
        this.cause = cause;
    }
}
